package lvm.fonctions.prim.subr;

import lvm.Contexte;
import lvm.LvmException;
import lvm.struct.*;
import lvm.fonctions.prim.fsubr.*;

public class Cons extends Subr {

	public Cons() {
		super("cons");
	}
	/**
	 * Construit une nouvelle liste
	 * @param arg: La liste des arguments (2)
	 * @return La Liste créée
	 */
	public Sexpr exec(Sexpr arg) throws LvmException {
		//On sélectionne le premier argument
		Sexpr s1 = arg.getCar();
		//On décide d'évaluer ou non selon la présence de la quote
		if (s1 instanceof Symbole && Contexte.getContexteCourant().getPrimitive((Symbole)s1) instanceof Quote)
			s1 = s1.getCdr();
		else
			s1 = s1.eval();

		//On sélectionne le deuxième argument
		Sexpr s2 = arg.getCdr().getCar();
		//On décide d'évaluer ou non selon la présence de la quote
		if (s2 instanceof Symbole && Contexte.getContexteCourant().getPrimitive((Symbole)s2) instanceof Quote)
			s2 = s2.getCdr();
		else
			s2 = s2.eval();
		
		return new Scons(s1, s2);
	}

}